package xpn.platform.modules.workflow.common;

import com.google.gson.JsonArray;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.RequestParam;
import xpn.platform.modules.workflow.common.dto.UserDto;
import xpn.platform.modules.workflow.definition.action.Action;
import xpn.platform.modules.workflow.other.comment.Comment;
import xpn.platform.modules.workflow.runtime.history.History;
import xpn.platform.modules.workflow.runtime.todo.Todo;
import xpn.platform.modules.workflow.runtime.todo.TodoDTO;
import xpn.platform.modules.workflow.definition.state.State;

import java.util.List;

/**
 * 流程服务接口
 *
 * @author 昆
 */
public interface WorkflowService {

    /**
     * 根据Id创建新流程
     *
     * @param id        流程Id
     * @param name      流程名称
     * @param no        流程编号
     * @param starterId the starter id
     * @param parentInstanceId  父流程实例id
     * @return 创建成功的待办 todo
     */
    TodoDTO startProcess(Long id, String name, String no, String starterId, String tokenName,
                         String token, String entityLink, String refVarName,
                         String parentInstanceId, String parentInstanceEntityLink);

    /**
     * 根据编号（即流程定义KEY）创建新流程
     *
     * @param no        流程编号
     * @param starterId the starter id
     * @return 创建成功的待办 todo
     */
    Todo startProcessByNo(String no, String starterId, String tokenName, String token, String entityLink, String refVarName);

    /**
     * 根据编号（即流程定义KEY）创建新流程
     *
     * @param no        流程编号
     * @param state     启动状态
     * @param starterId the starter id
     * @return 创建成功的待办 todo
     */
	Todo startProcessByNo(String no, State state, String starterId, String tokenName, String token, String entityLink,
                          String refVarName);
    /**
     * 根据执行者Id获取待办事项列表
     *
     * @param instanceId  流程实例Id
     * @param isCompleted true 代表获取完成的待办事项列表，false 相反
     * @param pageable    the pageable
     * @return 待办事项列表 todos by executor id
     */
    Page<Todo> getTodosByInstanceId(Long instanceId, Boolean isCompleted, Pageable pageable);

    /**
     * 根据执行者Id获取待办事项列表
     *
     * @param id          执行者Id
     * @param isCompleted true 代表获取完成的待办事项列表，false 相反
     * @param pageable    the pageable
     * @return 待办事项列表 todos by executor id
     */
    Page<Todo> getTodosByExecutorId(String id, boolean isCompleted, Pageable pageable);

    /**
     * 获取执行者在指定流程实例中的所有待办事项列表
     *
     * @param executorId  执行者Id
     * @param instanceId  流程实例Id
     * @param isCompleted true 代表获取完成的待办事项列表，false 相反
     * @param todoId      待办id
     * @param entityLink  //实体的连接
     * @param refVarName  //  在规则引擎中注入的模型名称
     * @param tokenName
     * @param token
     * @return 待办事项列表 todos by executor and instance
     */
    List<TodoDTO> getTodosByExecutorAndInstance(@RequestParam String executorId, @RequestParam Long instanceId, @RequestParam Long todoId,
                                                @RequestParam boolean isCompleted, String entityLink, String refVarName, String tokenName, String token);

    /**
     * 根据待办事项Id获取相应的操作列表
     *
     * @param todoId   待办事项的Id
     * @param pageable the pageable
     * @return 操作列表 actions by todo
     */
    Page<Action> getActionsByTodo(Long todoId, Pageable pageable);

    /**
     * 执行一个操作
     *
     * @param todoId        发送人的待办事项Id
     * @param actionId      所执行操作的Id
     * @param sendees       接收人
     * @param comment       填写意见操作所需要的具体数据
     * @param entityLink 实体连接
     * @param tokenName
     * @param token
     */
    Object execute(Long todoId, Long actionId, JsonArray sendees, String comment,
                   String tokenName, String token, Long commentActionId, String entityLink, Long stateId, String actionName);

    /**
     * 查询指定已办可收回的列表，空列表代表不可收回
     *
     * @param todoId 已办Id
     * @return 可收回的 History 列表
     */
    List<History> queryTakeBack(Long todoId);

    /**
     * 执行收回操作
     *
     * @param historyId
     * @param tokenName
     * @param token
     */
    void takeBack(Long historyId, String tokenName, String token);

    /**
     * 执行收回操作
     *
     * @param todoId
     * @param tokenName
     * @param token
     */
    void takeBackAllTodo(Long todoId, String tokenName, String token);

    /**
     * 检查操作列表的权限
     *
     * @param actions    操作列表
     * @param entityLink //实体的连接
     * @param refVarName //  在规则引擎中注入的模型名称
     * @param tokenName
     * @param token
     * @param startId
     */
    List<Action> checkPermissionOfActions(List<Action> actions, String entityLink, String refVarName, String tokenName, String token, String startId);

    /**
     * 根据流程实例Id 获取流程记录
     *
     * @param id 实例Id
     * @return 流程记录列表
     */
    List<History> getHistoriesByInstance(Long id);

    /**
     * 根据用户、实例、意见栏获取一条意见
     *
     * @param userId     用户Id
     * @param instanceId 实例Id
     * @param columnId   意见栏Id
     * @return 意见实体
     */
    Comment getCommentByUserAndInstanceAndTodoAndColumn(String userId, Long instanceId, Long todoId, Long columnId);

    /**
     * 根据待办事项Id获取相应的操作列表
     *
     * @param todoId     待办事项的Id
     * @param executorId 执行者Id
     * @param actionId   执行者Id
     * @param tokenName
     * @param token
     */
    Todo completeTodo(Long todoId, String executorId, Long actionId, String tokenName, String token);

    /**
     * 根据待办事项Id获取相应的操作列表
     *
     * @param todoId     待办事项的Id
     * @param executorId 执行者Id
     * @param actionId   执行者Id
     * @param tokenName
     * @param token
     */
    Todo doneToTodo(Long todoId, String executorId, Long actionId, String tokenName, String token);

    /**
     * 通过代办事项id获取可以退回的人员信息。
     * @param todoId
     * @return
     */
    List<UserDto> getGoBackUser(Long todoId);

    /**
     * 通过代办事项id获取可以f返回发送人信息。
     * @param todoId
     * @return
     */
    List<UserDto> returnSenderUser(Long todoId);

}
